﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace V82.ОбщиеМодули
{
	public partial class ОперативныйУчетПроизводства
	{
		////////////////////////////////////////////////////////////////////////////////
		// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ СО СМЕНАМИ
		// Определяет время начала выбранной смены (в секундах от начала дня).
		//
		// Параметры
		//  Смена - ссылка на элемент справочника Смены
		//
		// Возвращаемое значение
		//  число 			- время начала выбранной смены в секундах от начала дня
		//  Неопределено 	- смена не выбрана или её график не задан

		public object НачалоСмены(/*Смена*/)
		{
			/*//определим начало выбранной смены
*/
			/*//начало смены определяется по первой строке графика
*/
			/*//это может не являться общим для конфигурации принципом
*/
			/*Запрос = Новый Запрос(
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СменыПериодыСмены.НомерСтроки КАК НомерСтроки,
	|	СменыПериодыСмены.ВремяНачала КАК ВремяНачала
	|ИЗ
	|	Справочник.Смены.ПериодыСмены КАК СменыПериодыСмены
	|ГДЕ
	|	СменыПериодыСмены.Ссылка = &Смена
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерСтроки"
	);*/
			//Запрос.УстановитьПараметр("Смена", Смена);
			//Выборка = Запрос.Выполнить().Выбрать();
			if(true/*Выборка.Следующий()*/)
			{
			}
			return null;
		}
		// Определяет время окончания выбранной смены (в секундах от начала дня).
		//
		// Параметры
		//  Смена - ссылка на элемент справочника Смены
		//
		// Возвращаемое значение
		//  число 			- время начала выбранной смены в секундах от начала дня
		//  Неопределено 	- смена не выбрана или её график не задан

		public object КонецСмены(/*Смена*/)
		{
			/*//конец смены определяется по последней строке графика
*/
			/*//это может не являться общим для конфигурации принципом
*/
			/*Запрос = Новый Запрос(
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СменыПериодыСмены.НомерСтроки КАК НомерСтроки,
	|	СменыПериодыСмены.ВремяОкончания КАК ВремяОкончания 
	|ИЗ
	|	Справочник.Смены.ПериодыСмены КАК СменыПериодыСмены
	|ГДЕ
	|	СменыПериодыСмены.Ссылка = &Смена
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерСтроки УБЫВ"
	);*/
			//Запрос.УстановитьПараметр("Смена", Смена);
			//Выборка = Запрос.Выполнить().Выбрать();
			if(true/*Выборка.Следующий()*/)
			{
			}
			return null;
		}
		// Получает дату границы смены (из даты смены и номера смены) с учетом времени (документа).
		//  Для смен, переходящих через границу суток, будет возвращена дата той смены,
		//  которая началась к переданной дате и времени.
		//
		// Параметры
		//  Дата  - дата, с учетом времени
		//  Смена - ссылка на элемент справочника Смены
		//
		// Возвращаемое значение
		//  дата и время границы смены
		//

		public object ПолучитьГраницуСменыПоДате(/*Дата, Смена*/)
		{
			/*// Границей смены (и соответственно - датой смены) считаем дату её начала.
*/
			/*// Это близко к подходу, принятому в подсистеме ЗУП, т.к. отработанные
*/
			/*// часы относятся на день начала смены.
*/
			//НачалоСмены = НачалоСмены(Смена);
			//КонецСмены  = КонецСмены(Смена);
			if(true/*НачалоСмены = Неопределено*/)
			{
			}
			return null;
		}
		// Подготавливает текстовое описание предыдущей смены, за которую есть проведенные документы
		// указанного вида ("отчет мастера смены", "отчет о составе смены").
		//
		// Параметры
		//  Подразделение - ссылка на справочник Подразделения
		//  ГраницаСмены  - дата (с учетом времени) текущей смены
		//  ИмяДокумента  - строка, имя документа
		//
		// Возвращаемое значение
		//  строка, представление предыдущей смены

		public object ОписаниеПредыдущейСмены(/*Подразделение, ГраницаСмены, ИмяДокумента*/)
		{
			/*// Получим предыдущую смену - т.е. самую позднюю из смен до границы текущей смены
*/
			/*Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	|	ДокументОперативногоУчета.Смена,
	|	НАЧАЛОПЕРИОДА(ДокументОперативногоУчета.ГраницаСмены, ДЕНЬ) КАК Дата,
	|	ДокументОперативногоУчета.Ответственный
	|ИЗ
	|	Документ."+ИмяДокумента+" КАК ДокументОперативногоУчета
	|ГДЕ
	|	ДокументОперативногоУчета.Подразделение = &Подразделение
	|	И " 
	+ ?(Метаданные.Документы[ИмяДокумента].Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить, 
	"ДокументОперативногоУчета.Проведен", 
	"НЕ (ДокументОперативногоУчета.ПометкаУдаления)") 
	+ "
	|	И ДокументОперативногоУчета.ГраницаСмены < &ГраницаСмены
	|
	|УПОРЯДОЧИТЬ ПО
	|	ДокументОперативногоУчета.ГраницаСмены УБЫВ"
	);*/
			//Запрос.УстановитьПараметр("Подразделение", 		Подразделение);
			//Запрос.УстановитьПараметр("ГраницаСмены", 		ГраницаСмены);
			//Выборка = Запрос.Выполнить().Выбрать();
			if(true/*Выборка.Следующий()*/)
			{
			}
			return null;
		}
		// Возвращает представление смены
		//
		// Параметры
		//  ГраницаСмены  - граница смены
		//  Смена         - ссылка на справочник Смены
		//
		// Возвращаемое значение
		//  Строка, представление смены

		public object ПредставлениеСмены(/*ГраницаСмены, Смена*/)
		{
			//Возврат Формат(ГраницаСмены, "ДЛФ=D") + ?(Смена.Пустая(), "", " " + Смена);
			return null;
		}
		// Возвращает представление периода смены
		// Параметры
		//  ГраницаСмены  - граница смены
		//  Смена         - ссылка на справочник Смены
		//
		// Возвращаемое значение
		//  Строка, представление смены вида 01.01.0001 (00:00 - 23:59)

		public object ПредставлениеПериодаСмены(/*ГраницаСмены, Смена*/)
		{
			//НачалоСмены = НачалоСмены(Смена);
			//КонецСмены	= КонецСмены(Смена);
			if(true/*НачалоДня(ГраницаСмены) = '0001-01-01'*/)
			{
			}
			if(true/*НачалоСмены=Неопределено ИЛИ КонецСмены = Неопределено*/)
			{
				//Возврат Формат(ГраницаСмены,"ДЛФ=D");
			}
			/*Возврат 
		Формат(ГраницаСмены,"ДЛФ=D") 
		+ " (" + Формат('0001-01-01' + НачалоСмены,"ДФ=ЧЧ:мм") 
		+ " - " 
		+ Формат('0001-01-01' + КонецСмены,"ДФ=ЧЧ:мм") + ")";*/
			return null;
		}
		// Возвращает дату окончания смены (с учетом времени)
		// Параметры
		//  ГраницаСмены  - граница смены
		//  Смена         - ссылка на справочник Смены
		//
		// Возвращаемое значение
		//  Дата, последняя секунда смены

		public object ДатаВремяОкончанияСмены(/*ГраницаСмены, Смена*/)
		{
			//КонецСмены	= КонецСмены(Смена);
			if(true/*НачалоДня(ГраницаСмены) = '0001-01-01'*/)
			{
			}
			if(true/*КонецСмены = Неопределено*/)
			{
			}
			//НачалоСмены = (ГраницаСмены - НачалоДня(ГраницаСмены));
			/*// кол-во секунд от начала смены
*/
			if(true/*НачалоСмены > КонецСмены*/)
			{
				/*// Смена переходит на следующие сутки
*/
			}
			return null;
		}
		// Возвращает массив смен, начало и окончание которых находятся в разных днях
		// Параметры
		//  нет
		//
		// Возвращаемое значение
		//  Массив элементов справочника Смены

		public object СписокПереходящихСмен(/**/)
		{
			/*// Выберем смены, у которых время начала в первой строке табличной части периодов
*/
			/*// больше, чем время окончания в последней строке
*/
			//Запрос = Новый Запрос;
			/*Запрос.Текст = 
	"ВЫБРАТЬ
	|	СменыПериодыСмены.Ссылка КАК Смена
	|ИЗ
	|	Справочник.Смены.ПериодыСмены КАК СменыПериодыСмены
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	|			СменыПериодыСмены.Ссылка КАК Ссылка,
	|			МИНИМУМ(СменыПериодыСмены.НомерСтроки) КАК НомерПервойСтроки,
	|			МАКСИМУМ(СменыПериодыСмены.НомерСтроки) КАК НомерПоследнейСтроки
	|		ИЗ
	|			Справочник.Смены.ПериодыСмены КАК СменыПериодыСмены
	|		
	|		СГРУППИРОВАТЬ ПО
	|			СменыПериодыСмены.Ссылка) КАК ПериодыСмен
	|		ПО СменыПериодыСмены.Ссылка = ПериодыСмен.Ссылка
	|			И (СменыПериодыСмены.НомерСтроки = ПериодыСмен.НомерПервойСтроки
	|				ИЛИ СменыПериодыСмены.НомерСтроки = ПериодыСмен.НомерПоследнейСтроки)
	|
	|СГРУППИРОВАТЬ ПО
	|	СменыПериодыСмены.Ссылка
	|
	|ИМЕЮЩИЕ
	|	МАКСИМУМ(ВЫБОР
	|			КОГДА СменыПериодыСмены.НомерСтроки = ПериодыСмен.НомерПервойСтроки
	|				ТОГДА СменыПериодыСмены.ВремяНачала
	|			ИНАЧЕ NULL
	|		КОНЕЦ) > МАКСИМУМ(ВЫБОР
	|			КОГДА СменыПериодыСмены.НомерСтроки = ПериодыСмен.НомерПоследнейСтроки
	|				ТОГДА СменыПериодыСмены.ВремяОкончания
	|			ИНАЧЕ NULL
	|		КОНЕЦ)";*/
			//Результат = Запрос.Выполнить();
			return null;
		}
		// Получает смену, в которую по сменному графику в указанную дату должен работать сотрудник.
		// Если на указанную дату такой смены нет, то выполняется поиск на предыдущую дату среди смен,
		// начало и окончание которых находится в разных днях.
		//
		// Параметры
		//  ФизЛицо - ссылка на справочник ФизическиеЛица
		//  Дата    - дата (с временем 00:00:00)
		//
		// Возвращаемое значение
		//  СправочникСсылка.Смены
		//

		public object ПолучитьСменуПоГрафику(/*ФизЛицо, Дата*/)
		{
			if(true/*ФизЛицо.Пустая()*/)
			{
			}
			return null;
		}
		// По регистру ЗавершенныеСмены проверяет возможность редактирования документов,
		// если редактировать нельзя - то устанавливает Отказ.
		// Редактирование документов закрытых смен не запрещается, если это пометка на удаление не проведенного документа.
		//
		// Параметры
		//  Объект - документ-объект имеющий реквизиты "Подразделение" и "ГраницаСмены"
		//  Отказ  - булево, будет изменено в процедуре на Истина, если редактирование запрещено.

		public void ПроверкаЗапретаРедактированияЗакрытыхСмен(/*Объект, Отказ, РежимЗаписи*/)
		{
			//УстановитьПривилегированныйРежим(Истина);
			if(true/*НЕ Отказ*/)
			{
				if(true/*РольДоступна("ПолныеПрава")*/)
				{
					/*//Запрет не распространяется на пользователей с полными правами
*/
				}
			}
		}
	}
}
